package com.tedu.api.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO   :传输数据   C/S  聊天室 Version
 * API上篇：字符串  包装类 日期类 集合
 * ----------------电脑有三大件：CPU 硬盘 内存
 * API上部分：IO流     -----硬盘-----文件数据传输
 *
 * 包位置：java.io
 * File文件、文件夹类（过渡）
 * 作用：用于表示操作系统中系统的一个文件或者是“目录：文件夹”
 * 创建File对象----->有参构造器----->“路径+文件/文件夹全称”
 *
 * File类方法使用
 * 1.查看该文件或者“文件夹：目录”（数字  大小 是否存在）
 * 2.操作文件或者“文件夹：目录”（创建 删除）
 * 3.访问一个“文件夹：目录”的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
       // 创建文件类
        //需求：当前API下创建文件------手动------demo.txt  char r='\\'
      /*  File file=new File("C:\\Users\\wikt2\\IdeaProjects\\java-api\\API\\src\\main" +
                "\\java\\com\\tedu\\api\\io\\demo.txt");*/

        //相对路径----当前API下创建文件！ 项目： Maven结构 main编写代码
        //FileAPI.java  相对于   API 项目下-->从src开始
        //操作系统：路径    \  代表路径     文件上传至服务器   √
        //                /  代表路径     文件下载到本地
        // Java任何平台【任何操作系统】运行  统一路径属性
        // File.separator   静态属性 ：任何操作系统下 转换成正确的路径表示方式
        File file=new File("src"+File.separator+"main" +
                ""+File.separator+"java" +
                ""+File.separator+"com" +
                ""+File.separator+"tedu" +
                ""+File.separator+"api" +
                ""+File.separator+"io" +
                ""+File.separator+"demo.txt");

        //判断文件是否存在的方法、
       boolean b= file.exists();
        System.out.println("判断文件是否存在:"+b);

    }
    /**
     * 查看文件或者文件夹属性信息：
     * getName（）         返回值：String
     * 作用：获取文件的名字【注释：】
     * length（）          返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists（）    返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL(){
        //创建文件类---路径：Maven项目--相对路径
        //相对路径：./ 当前API项目下
        File file=new File("."+File.separator+"demo.txt");
        //打印 file 的路径
        System.out.println("打印file路径："+file.getAbsolutePath());
        //文件是否存在
        System.out.println("路径文件是否存在："+file.exists());
        //获取文件名字    不看路径只看名
      String name=  file.getName();
        System.out.println("文件或者文件夹的名字："+name);
        //获取文件的“大小=字节量”
       long len= file.length();
        System.out.println("获取文件的大小【字节量】:"+len);
    }


    /**
     * 使用代码来完成文件或者目录自动创建
     * createNewFile（）
     * 作用：创建一个新文件
     * 需求：使用代码来完成API项目文件夹下 自动创建 test.txt文件或者目录自动创建
     *
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称 ./test.txt
        File file=new File("."+File.separator+"test.txt");
        //判断---如果文件不存在---false----创建
        //       如果文件存在----不创建
        if(!file.exists()){
            System.out.println("文件不存在--");
            file.createNewFile();
            System.out.println("文件已经创建--");
        }else{
            System.out.println("文件存在，别创建了--");
        }

    }


    /**
     * delete（）
     * 作用：删除文件或者文件夹
     * 需求：将API项目下的   test.txt  删除
     */
    @Test
    public void testDelete(){
       //创建File类    路径：./text.txt   ./不写代表 当前API项目
       File file=new File("test.txt");
       //判断 如果文件  存在---->删除
        //           不存在--->删除
        if(file.exists()) {
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除--");
        }else {
            System.out.println("文件已经删除辣--");
        }
    }


  /**
   * mkdir()
   * 作用：创建一个文件夹
   * 需求：在 API 项目下创建一个文件夹叫 demo
   *
   * 多层文件夹：demo/abc/bcd
   * mkdirs()
   * 作用：创建多层文件夹
   */
   @Test
     public void testMkdir(){
       //创建File文件/文件夹---->创建demo文件夹   / abc / bcd
       File file=new File("demo" +
               ""+File.separator+"abc" +
               ""+File.separator+"bcd");
       //判断 如果demo文件不存在  ---创建文件夹
       //                存在   ---不创建
       if(!file.exists()){
           System.out.println("文件夹不存在--");
           file.mkdirs();
           System.out.println("文件夹已经创建--");
       }else{
           System.out.println("文件夹存在，别创建了--");
       }
     }

    /**
     * 作业1：删除多层文件夹 demo/abc/bcd 【不能使用递归】
     *       提示：构造器  new File（File path，“子路径”）；
     *       不需要exists判断
     * 思路：找到每一级路径【bed删除完毕---abc删除完毕-demo】
     */
    @Test
    public void testHomework1(){
        //1.创建多层文件夹 demo/abc/bcd
        File parent=new File("demo" );
         //构造器使用（父级路径，子级路径）；父级路径/子级路径
        File child1=new File(parent,"abc");
        File child2=new File(child1,"bcd");
        child2.delete();  //删除bcd
        child1.delete();  //删除abc
        parent.delete();  //删除demo

        //作业2：提示---创建FileFilter接口--匿名内部类
      /*  FileFilter ff=new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return false;
            }
        };*/
      /*  parent.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return false;
            }
        });*/
    }

    /**
     * 访问文件夹--->所有子项【文件夹和文件】
     * listFiles（）  返回值：File【】  文件数组
     * 作用：获取文件夹的所有子项【包含文件夹和文件】
     * isFile（）  返回值：boolean
     * 作用：判断是否为文件，是文件true，反之
     * isDirectory 返回值：boolean
     * 作用：判断是否为文件夹，是文件夹true 反之
     * 需求：获取 API 项目下 所有的文件夹文字
     */
    @Test
    public void testListFiles() throws IOException {
        //获取 API 项目
        File file=new File("."+File.separator);
       // System.out.println(file.getCanonicalFile());
        //过滤：3个文件还有文件夹，过滤是文件夹
        if(file.isDirectory()){
            //获取到所有文件夹
           File[] dir =file.listFiles();
           //遍历所有的文件夹的名字
            for(int i=0;i<dir.length;i++){//拿到所有的下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }
}
